// 定义函数参数的类型
interface RequestOptions {
    headers?: Record<string, string>;
    next?: Object;
}

export interface MyResponse {
    code?: Number | any;
    data?: any;
    message?: string | any;
}

export interface QueryIProps {
    params: {
        query: any[]
    },
    searchParams: Object | any
}

export const request = async <T>(
    url: string,
    method: 'GET' | 'POST' | 'PUT' | 'DELETE' = 'GET',
    params: Record<string, any> = {},
    options: RequestOptions = {}
): Promise<T> => {
    // 如果配置成locolhost，服务端渲染页面是正常的，但是api类就有问题了
    const prefix = 'https://www.skits.online/skits'; 
    url = prefix + url;

    console.log('请求url:', url, params)

    // 初始化请求头
    const headers: Record<string, string> = {
        'Content-Type': 'application/json',
        'Referrer-Policy': 'strict-origin-when-cross-origin', // 设置 Referrer-Policy
        ...options.headers, // 如果提供了额外的头部信息，则合并
    };

    // 配置 fetch 的选项
    const fetchOptions: RequestInit = Object.assign(options, {
        method,
        headers,
    })

    if (method.toUpperCase() === 'GET') {
        // 对于 GET 请求，将参数作为查询字符串附加
        const queryString = new URLSearchParams(params).toString();
        url += queryString ? `?${queryString}` : '';
    } else {
        // 对于 POST/PUT/DELETE 请求，设置请求体
        fetchOptions.body = JSON.stringify(params);
    }

    try {
        const response = await fetch(url, fetchOptions);

        // 如果请求失败并且是 404，不抛出错误，直接返回空对象或默认值
        if (response.status === 404) {
            console.warn(`请求路径不存在: ${url}`);
            return {} as T; // 返回默认值，确保类型安全
        }

        // 获取响应文本
        const responseText = await response.text();

        // 检查响应是否是 JSON 格式
        let responseBody: any;
        try {
            responseBody = JSON.parse(responseText);
        } catch (e) {
            // 如果无法解析为 JSON，则直接返回原始文本
            responseBody = responseText;
        }

        // 如果是 Token 过期的错误码
        if (response.status === 401 || responseBody.code === 50002) {
            // 跳转到登录页面或清除本地存储的 Token
            // cancellation();
        }

        if (!response.ok) {
            throw new Error(`HTTP 错误! 状态码: ${response.status}`);
        }

        return responseBody as T; // 将响应类型强制转换为泛型 T
    } catch (error) {
        console.error('请求错误:', error);
        // 返回空对象或默认值，确保调用者能继续正常处理
        return {} as T; // 你可以根据需求返回不同的默认值
    }
};

const cancellation = async () => {
    try {
        const response = await fetch('/api/logout', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
        });
        if (response.ok) {
            window.location.replace(location.href)
        }
    } catch (error) {
    }
}

// const prefix = 'http://localhost:8095'

// export const request = async (url, method = 'GET', params = {}, options = {}) => {
//     url = prefix + url
//     // Initialize headers
//     const headers = {
//         'Content-Type': 'application/json',
//         // 'Cache-Control': 'no-cache', // 不使用缓存
//         'Referrer-Policy': 'strict-origin-when-cross-origin', // 设置 Referrer-Policy
//         ...options.headers, // Merge additional headers if provided
//     };


//     // Configure fetch options
//     const fetchOptions = {
//         method,
//         headers,
//     };

//     if (method.toUpperCase() === 'GET') {
//         // For GET, append params as query strings
//         const queryString = new URLSearchParams(params).toString();
//         url += queryString ? `?${queryString}` : '';
//     } else {
//         // For POST/PUT/DELETE, include body
//         fetchOptions.body = JSON.stringify(params);
//     }

//     try {
//         const response = await fetch(url, fetchOptions);
//         if (!response.ok) {
//             throw new Error(`HTTP error! Status: ${response.status}`);
//         }
//         return await response.json();
//     } catch (error) {
//         console.error('Request error:', error);
//         throw error; // Re-throw the error for caller handling
//     }
// };



